#include<bits/stdc++.h>

using namespace std;
using ll = long long;
#define endl '\n'
const int maxn = 4;
int n = 4, m = 4;
char G[maxn][maxn] = {  //平面图 矩形 默认行为n 列为m
        'A', 'B', 'C', 'D',
        'E', 'F', 'G', 'H',
        'I', 'J', 'K', 'L',
        'M', 'N', 'O', 'P'
};
int book[maxn][maxn];
int fx[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};//四连通 顺时针方向
void dfs(int x, int y) {
    cout << G[x][y] << " ";
    book[x][y] = 1;
    for (int i = 0; i < 4; i++) {
        int nx = x + fx[i][0];//相邻的四连通点的x新坐标
        int ny = y + fx[i][1];//相邻的四连通点的y新坐标
        if (nx < 0 || nx >= n || ny < 0 || ny >= m)continue; //检查位置的有效性
        if (book[nx][ny] == 1)continue;//避免重复访问
        dfs(nx, ny);
    }
}

int main() {

    dfs(0, 0);
    return 0;
}
/**
这个程序是一个简单的DFS遍历平面图的示例。程序定义了一个4x4的字符型数组G，表示一个平面图（矩形），其中'A'到'P'表示不同的点，四联通规则连通。另外定义了一个二元组fx，用来表示在遍历中每个节点的四个四连通节点（顺时针方向）。

接下来，程序定义了一个DFS遍历函数dfs，其输入参数是一个起点 (x, y) 的坐标。这个函数用book数组来记录每个坐标是否已经被遍历过。对起点(x, y)进行访问并将它的book值设为1。然后，程序递归遍历与这个点相邻的四个节点，如果未被遍历过，递归访问这个节点。

最后在int main()函数中，调用dfs函数，其参数为起点坐标(0,0)，即从左上角开始遍历平面图。程序输出所有遍历到的字符值，即从起点出发可以到达的所有位置的字母。*/